package org.opencms.free.balance;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.opencms.widgets.CmsInputWidget;
import org.opencms.workplace.CmsWidgetDialog;
import org.opencms.workplace.CmsWidgetDialogParameter;
import org.opencms.workplace.CmsWorkplaceSettings;

/**
 * Clase que representa el formulario de edición de un nodo.
 */
public class BalanceFreeNodeEdit extends CmsWidgetDialog {

    /**
     * Atributo que representa el prefijo del formulario.
     */
    private static final String KEY_PREFIX = "nodemanagement";

    /**
     * Atributo que representa las páginas que conformarán el formulario de alta de un nodo.
     */
    private static final String[] PAGE_ARRAY = {"node_info"};

    /**
     * Atributo que contiene las páginas que conformarán el formulario de alta de un nodo.
     */
    private static final List PAGE_LIST = Arrays.asList(PAGE_ARRAY);

    /**
     * Objeto de la clase BalanceFreeNode, es necesario para mapear los valores del nodo a crear con los campos del
     * formulario.
     */
    private BalanceFreeNode node;

    /**
     * Atributo que contendrá un texto de información.
     */
    private String infoText;

    /**
     * Constructor de la clase.
     */
    public BalanceFreeNodeEdit(final PageContext context, final HttpServletRequest req, final HttpServletResponse res) {
        super(context, req, res);
        this.node = new BalanceFreeNode();
    }

    /**
     * Método observador del atributo infoText.
     */
    public String getInfoText() {
        return this.infoText;
    }

    /**
     * Método modificador del atributo infoText.
     */
    public void setInfoText(final String infoText) {
        this.infoText = infoText;
    }

    /**
     * Método que realiza las acciones necesarias para editar los datos de un nodo.
     */
    public void actionCommit() throws IOException, ServletException {
        List errors = new ArrayList();
        // Obtenemos el nodo modificado.
        BalanceFreeNode changedNode = (BalanceFreeNode) ((Hashtable) (getSettings().getDialogObject())).get(this
                .getClass().getName());
        BalanceFreeNodeDao nodeDAO = new BalanceFreeNodeDaoImpl();
        this.node = (BalanceFreeNode) this.getSession().getAttribute("oldNode");
        changedNode.setNodeId(this.node.getNodeId());
        nodeDAO.updateNode(changedNode);
        this.node = null;
        setCommitErrors(errors);
    }

    /**
     * Método que inicializa el workplace con los datos del formulario.
     */
    protected void initWorkplaceRequestValues(final CmsWorkplaceSettings settings, final HttpServletRequest request) {
        setKeyPrefix(KEY_PREFIX);
        super.initWorkplaceRequestValues(settings, request);
        setDialogObject(this.node);
    }

    /**
     * Método que define los widgets que conformarán el formulario.
     */
    protected void defineWidgets() {
        String nodeId = getJsp().getRequest().getParameter("nodeId");
        if (nodeId == null) {
            this.node = new BalanceFreeNode();
        } else {
            BalanceFreeNodeDao nodeDAO = new BalanceFreeNodeDaoImpl();
            this.node = (BalanceFreeNode) nodeDAO.findNode((new Integer(nodeId)).intValue());
            // Guardamos en sesión el nodo original
            this.getSession().setAttribute("oldNode", this.node);
        }
        addWidget(new CmsWidgetDialogParameter(this.node, "nodeName", PAGE_ARRAY[0], new CmsInputWidget()));
        addWidget(new CmsWidgetDialogParameter(this.node, "nodeUrl", PAGE_ARRAY[0], new CmsInputWidget()));
    }

    /**
     * Método que inicializa el objeto de gestión de mensajes.
     */
    protected void initMessages() {
        addMessages(Messages.get().getBundleName());
        super.initMessages();
    }

    /**
     * Método observador del atributo PAGE_ARRAY.
     */
    protected String[] getPageArray() {
        return PAGE_ARRAY;
    }
}